#include<iostream>
//#include<thread>        //for c++
#include<pthread.h>
#include<unistd.h>
using namespace std;

int g_val = 10;

// void* RunRoutine(void *arg)
// {
//     char buff[64];
//     snprintf(buff, sizeof(buff), "%s", arg);
//     int cnt = 0;
//     while(true)
//     {
//         //printf("%s is running, pid = %d, g_val = %d, &g_val = %p\n", buff, getpid(), g_val, &g_val);
//         cout << buff << " is running, cnt = " << cnt << endl;
//         sleep(1);
        
//         // int a = 10;
//         // a /= 0;

//         ++cnt;
//         if(cnt == 5)    break;
//     }
//     cout << "RunRoutine is over" << endl;
//     pthread_exit((void*)1);
//     //exit(1);
//     //return (void*)1;
// }

// int main()
// {
//     //PTHREAD_CANCELED;
//     pthread_t tid;
//     pthread_create(&tid,nullptr, RunRoutine, (void*)"thread 1");
//     sleep(1);
//     cout << "main thread: " << getpid() << " , thread created" << endl;
//     // pthread_cancel(tid);
//     // cout << "main thread: " << getpid() << " , thread tid " << tid << " canceled" << endl;
//     // sleep(1);
//     //return 0;
//     // while(true)
//     // {
//     //     cout << "main thread: " << getpid() << " is running" << endl;
//     //     sleep(1);
//     //     ++g_val;
//     // }
//     int ret = pthread_join(tid, nullptr);
//     cout << "pthread_join wait over, ret = " << ret << endl;

//     return 0;
// }



// class request
// {
// public:
//     request(int start, int end, const string &threadName)
//         :_start(start), _end(end), _threadName(threadName)
//     {}
//     int _start;
//     int _end;
//     string _threadName;
// };

// class respond
// {
// public:
//     respond(int ret, int exitCode)
//         :_ret(ret), _exitCode(exitCode)
//     {}
//     int _ret;
//     int _exitCode;
// };

// void *CalSum(void * arg)
// {
//     request *rq = static_cast<request*>(arg);        //关键字第一个为static，不是const
//     respond *rsp = new respond(0, 0);
//     for(int i = rq->_start; i <= rq->_end; ++i)
//     {
//         rsp->_ret += i;
//         cout << "ret = " << rsp->_ret << endl;
//         usleep(100000);
//     }
//     return (void*) rsp;

// }

// int main()
// {
//     pthread_t tid;
//     //request *rq = new request(0,100, "thread 1");
//     request rq(0,100, "thread 1");
//     pthread_create(& tid, nullptr, CalSum, &rq);
//     cout << "thread created" << endl;
//     respond *rsp;
//     pthread_join(tid, (void**)&rsp);
//     rsp = static_cast<respond*>(rsp);
//     cout << rq._threadName << " work done, " << "ret = " << rsp->_ret << ", exitcode = " << rsp->_exitCode << endl;
//     delete rsp;

//     return 0;
// }





// void threadRun()
// {
//     cout << "thread running" << endl;
//     for(int i =0; i < 10; ++i)
//     {
//         cout << "thread pid = " << getpid() << ", is running " << i << endl;
//         sleep(1); 
//     }
// }

// int main()
// {
//     thread th(threadRun);
//     cout << "main thread pid = " << getpid() << ", say thread created" <<endl;
//     th.join();

//     return 0;
// }





// string ToHex(pthread_t tid)
// {
//     char buff[64];
//     snprintf(buff, sizeof(buff), "%p", tid);
//     return buff;
// }

// void *RunRoutine(void *arg)
// {
//     char *threadName = (char*)arg;
//     for(int i = 0; i < 5; ++i)
//     {
//         cout << threadName << ", tid: " << ToHex(pthread_self()) <<  ", is running " << i << endl;
//         sleep(1);
//         //pthread_exit((void*)1);
//         if(i == 2)
//         {
//             //exit(1);
//             return (void*)1;
//         }
//     }

// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, RunRoutine, (void*)"thread 1");
//     cout << "main thread create work done, new thread id: " << ToHex(tid) << endl;
//     // sleep(1);
//     // pthread_cancel(tid);
//     // cout << "main thread: " << getpid() << " , thread tid " << ToHex(tid) << " canceled" << endl;
//     // sleep(1);
//     int ret = pthread_join(tid, nullptr);
//     cout << "pthread_join wait over, ret = " << ret << endl;

//     return 0;
// }


void *RunRoutine(void *arg)
{
    pthread_detach(pthread_self());
    char *threadName = (char*)arg;
    for(int i = 0; i < 5; ++i)
    {
        cout << threadName << ", tid: " << pthread_self() <<  ", is running " << i << endl;
        sleep(1);
    }

}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, RunRoutine, (void*)"thread 1");
    cout << "main thread create work done, new thread id: " << tid << endl;
    sleep(6);
    cout << "sleep time over" << endl;
    return 0;
}